Traditionally, software development has been viewed as an activity associated with individual developers or small groups of developers. As a result, since desktop computing became widely available, software development has been associated with activity on a workstation or a desktop computer. Accordingly, it is not surprising that current integrated software development tools, such as Visual Studio® by Microsoft® Corporation, are packaged and delivered as client centric applications. Also, the business models associated with selling software development tools focus on improvements to client-oriented software development. Among the various activities related to the software development process, compiling source code is a very familiar process to developers that has not changed substantially over the last few decades. However, in this same period, computational resources including CPU, memory, network bandwidth, etc. that are available for compilation have increased dramatically.
As the scale of software development increases and the capabilities of the computational resources improve, in particular the capability to collaborate via network of computers, the view that software development is a desktop-based client-centric activity is being challenged. As large teams need to coordinate activities related to software development, increasingly important parts of the software development process have shifted to a client-server network environment to enable the use of a network of computational resources to process, unify, and coordinate the activities of multiple teams. Desktop based client solutions that focus on a typical integrated development environment (IDE) (e.g., Visual Studio®, Rational®, etc.) provide limited direct support for such networked software development activity. As a result, much of the software development work is implemented in an ad hoc manner with each team recreating its own process, and tools, which can lead to numerous mistakes.
A number of other problems exist with the current desktop-based client-centric approach to software development activities. Each time a source file of a software program is processed (e.g., compiled, optimized, analyzed, etc.) during the software development process, it is viewed in isolation. For instance, current compilers do not attempt to understand the relationship between source files compiled today and those compiled yesterday. Likewise, they do not attempt to reason about identical source files submitted during different build processes. Furthermore, when new tools become available, they have to be explicitly noticed by the developers and then correctly installed on their desktop machine to be of any use. This requires the developers to have extensive knowledge of the availability and the suitability of various software development tools to their tasks. Likewise, developers need to be aware of upgrades to the tools as they become available and install such upgrades.
The desktop based software development model makes poor use of valuable computing resources for one more reason. For instance, development teams rely on source files containing, not only the source files generated by them, but also those generated by other team members of the project. Also a large set of software development tools may be deployed for use on the project. Thus, copies of each of the source files that the other project team members are working on, as well as copies of the various software development tools that are deployed, will have to be maintained on each of the desktop machines of a software development team. Also, as new software development tools are deployed, they too have to be installed and managed, thus requiring additional computing resources and time.
The process of bringing together the various components of a software application developed on different desktop machines also can be error prone and require an inordinate amount of effort by the developers. This is so because even the slightest variations in the desktop machines lead to problems during the build process. Correct builds require complex build environments to be replicated as closely as possible on many different desktops. However, many of the dependencies between the software components and the environment (e.g., registry entries, versions, etc.) in which they are built are implicit and hard to enumerate in order to replicate the environment wholly during the build process.
Thus, there is a need for an improved software development model, wherein software development activities, such as compiling, analyzing, and building software are implemented through a network of machines.